package com.wh.minihelp.weixin.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

/**
 * 
 * 微信消息工具类
 * 
 * @version
 */
public class MessageUtil {
	/**
	 * 返回消息类型：文本
	 */
	public static final String SEND_TEXT = "text";

	/**
	 * 返回消息类型：音乐
	 */
	public static final String SEND_MUSIC = "music";

	/**
	 * 返回消息类型：图文
	 */
	public static final String SEND_NEWS = "news";

	/**
	 * 请求消息类型：文本
	 */
	public static final String RECRIVE_TEXT = "text";

	/**
	 * 请求消息类型：图片
	 */
	public static final String RECRIVE_IMAGE = "image";

	/**
	 * 请求消息类型：链接
	 */
	public static final String RECRIVE_LINK = "link";

	/**
	 * 请求消息类型：地理位置
	 */
	public static final String RECRIVE_LOCATION = "location";

	/**
	 * 请求消息类型：音频
	 */
	public static final String RECRIVE_VOICE = "voice";

	/**
	 * 请求消息类型：推送
	 */
	public static final String RECRIVE_EVENT = "event";

	/**
	 * 事件类型：subscribe(订阅)
	 */
	public static final String RECRIVE_SUBSCRIBE = "subscribe";

	/**
	 * 事件类型：unsubscribe(取消订阅)
	 */
	public static final String RECRIVE_UNSUBSCRIBE = "unsubscribe";

	/**
	 * 事件类型：CLICK(自定义菜单点击事件)
	 */
	public static final String RECRIVE_CLICK = "CLICK";

	/**
	 * 解析微信发来的请求（XML）
	 * 
	 * @param request
	 * @return
	 * @throws IOException
	 * @throws DocumentException
	 * @throws Exception
	 */
	public static Map<String, String> parseReceiveMsg(InputStream in, String encoding) throws IOException, XmlPullParserException {
		Map<String, String> map = new HashMap<String, String>();
		XmlPullParser parser = null;
		try {
			XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
			factory.setNamespaceAware(true);
			parser = factory.newPullParser();
			parser.setFeature("http://xmlpull.org/v1/doc/features.html#xml-roundtrip", true);
			parser.setInput(new InputStreamReader(in, encoding == null ? "utf-8" : encoding));
			String preTag = null;
			for (int eventType = parser.getEventType(); //
			eventType != XmlPullParser.END_DOCUMENT; //
			eventType = parser.next()) {
				if (eventType == XmlPullParser.START_TAG) {// 开始标记
					preTag = parser.getName();
				} else if (eventType == XmlPullParser.TEXT) {// 标记间的文本
					if (preTag != null) {
						map.put(preTag, parser.getText());
					}
				} else if (eventType == XmlPullParser.END_TAG) {// 结束标记
					preTag = null;
				}
			}
			return map;
		} catch (XmlPullParserException e) {
			if (parser != null) logError(e, parser);
			throw e;
		} catch (IOException e) {
			if (parser != null) logError(e, parser);
			throw e;
		}
	}

	private static void logError(final Throwable e, XmlPullParser parser) {
		System.err.println("Depth = " + parser.getDepth());
		System.err.println("LineNumber = " + parser.getLineNumber());
		System.err.println("name = " + parser.getName());
		System.err.println("Position = " + parser.getPositionDescription());
	}

	// /**
	// * 文本消息对象转换成xml
	// *
	// * @param textMessage
	// * 文本消息对象
	// * @return xml
	// */
	// public static String textMessageToXml(SendTextMessage textMessage) {
	// xstream.alias("xml", textMessage.getClass());
	// return xstream.toXML(textMessage);
	// }
	//
	// /**
	// * 音乐消息对象转换成xml
	// *
	// * @param musicMessage
	// * 音乐消息对象
	// * @return xml
	// */
	// public static String musicMessageToXml(SendMusicMessage musicMessage) {
	// xstream.alias("xml", musicMessage.getClass());
	// return xstream.toXML(musicMessage);
	// }
	//
	// /**
	// * 图文消息对象转换成xml
	// *
	// * @param newsMessage
	// * 图文消息对象
	// * @return xml
	// */
	// public static String newsMessageToXml(SendNewsMessage newsMessage) {
	// xstream.alias("xml", newsMessage.getClass());
	// xstream.alias("item", new SendArticle().getClass());
	// return xstream.toXML(newsMessage);
	// }
	//
	// /**
	// * 扩展xstream，使其支持CDATA块
	// *
	// * @date 2013-05-19
	// */
	// private static XStream xstream = new XStream(new XppDriver() {
	// public HierarchicalStreamWriter createWriter(Writer out) {
	// return new PrettyPrintWriter(out) {
	// // 对所有xml节点的转换都增加CDATA标记
	// boolean cdata = true;
	//
	// @SuppressWarnings("unchecked")
	// public void startNode(String name, Class clazz) {
	// super.startNode(name, clazz);
	// }
	//
	// protected void writeText(QuickWriter writer, String text) {
	// if (cdata) {
	// writer.write("<![CDATA[");
	// writer.write(text);
	// writer.write("]]>");
	// } else {
	// writer.write(text);
	// }
	// }
	// };
	// }
	// });
	

	/**
	 * 回复文本消息
	 * 
	 * @param openid
	 *            粉丝openid
	 * @param weixinId
	 *            微信公众号
	 * @param respContent
	 *            回复信息
	 * @return
	 */
	public static String sendTextmessage(String openid, String weixinId, String respContent) {
		// 初始化回复信息
		String respmessage = "<xml>"//
				+ "<ToUserName><![CDATA[" + openid + "]]></ToUserName>"//
				+ "<FromUserName><![CDATA[" + weixinId + "]]></FromUserName>"//
				+ "<CreateTime>" + System.currentTimeMillis() + "</CreateTime>"//
				+ "<MsgType><![CDATA[" + MessageUtil.SEND_TEXT + "]]></MsgType>"//
				+ "<Content><![CDATA[" + respContent + "]]></Content>"//
				+ "</xml>";
		// 返回回复信息
		return respmessage;
	}
}